package com.wind.lambda;

/**
 * Lambda表达式 语法简化
 * <p/>
 * 简化主要针对的是：参数类型、小括号、大括号
 *
 * @author Wind
 */
public class LambdaTest02 {
    public static void main(String[] args) {
        /*
            1. 简化参数类型：可以不写参数类型，但必须所有参数都不写
         */
        // 正常语法
        NoRetrunMultiParam noRetrunMultiParam = (int a, int b) -> {
            System.out.println("无返回值有多个参数：" + (a + b));
        };
        noRetrunMultiParam.method(10, 5);
        // 简化写法：可以不写参数类型，但必须所有参数都不写
        NoRetrunMultiParam noRetrunMultiParam1 = (a, b) -> {
            System.out.println(a + b);
        };
        noRetrunMultiParam1.method(15, 20);

        /*
            2. 简化参数小括号。如果只有一个参数可以省略参数小括号()
         */
        // 正常语法
        NoRetrunOneParam noRetrunOneParam = (int a) -> {
            System.out.println("无返回值有一个参数：" + a);
        };
        noRetrunOneParam.method(10);
        // 简化写法：如果只有一个参数可以省略参数小括号()
        NoRetrunOneParam noRetrunOneParam1 = a -> {
            System.out.println("只有一个参数可以省略参数小括号()" + a);
        };
        noRetrunOneParam1.method(10);

        /*
            3. 简化方法体大括号。如果方法体中只有一行语句，则可以省略方法体大括号{}
         */
        // 正常语法
        NoRetrunNoParam noRetrunNoParam1 = () -> {
            System.out.println("无返回值无参数~OK!");
        };
        noRetrunNoParam1.method();
        // 简化写法：方法体中只有一行语句，则可以省略方法体大括号{}
        NoRetrunNoParam noRetrunNoParam2 = () -> System.out.println("当实现类方法体中只有一行代码可以省略大括号~OK!");
        noRetrunNoParam2.method();

        /*
            4. 简化方法体大括号。如果方法体只有一条语句，并且是 return 语句，则可省略方法体大括号和 return 关键字
         */
        // 正常语法
        RetrunMultiParam retrunMultiParam = (int a, int b) -> {
            return a + b;
        };
        System.out.println("有返回值有多个参数：" + retrunMultiParam.method(20, 30));
        // 简化语法
        RetrunMultiParam retrunMultiParam1 = (a, b) -> a + b;
        System.out.println("有返回值有多个参数：" + retrunMultiParam1.method(20, 30));
    }
}
